package com.example.demo.controller;

import com.example.demo.model.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Paths;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

@Api(value = "文件上传，下载相关功能")
@RestController
@RequestMapping("/api/file")
public class FileUploadController {
    // 设置固定的日期格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    // 将 yml 中的自定义配置注入到这里
    @Value("${gorit.file.root.path}")
    private String filePath;
    // 日志打印
    private Logger log = LoggerFactory.getLogger("FileController");

    // 文件上传 （可以多文件上传）
    @PostMapping("/upload")
    public ApiResponse<String> fileUploads(HttpServletRequest request, @RequestParam("file") MultipartFile file) {
        // 文件类型校验
        log.info("Request parameters: {}", request.getParameterMap());
        String[] allowedTypes = { "image/png", "image/jpeg", "application/pdf" };
        if (!Arrays.asList(allowedTypes).contains(file.getContentType())) {
            return ApiResponse.error(415, "不支持的文件类型，仅允许PNG、JPEG和PDF格式");
        }

        // 文件大小校验（需配合application.properties配置）
        if (file.getSize() > 10 * 1024 * 1024) {
            return ApiResponse.error(413, "文件大小超过10MB限制");
        }

        // 调用上传文件的方法
        return uploadFile(file);
    }
    private ApiResponse<String> uploadFile(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String newFileName = fileName;

        // 使用 Paths.get 构建路径
        java.nio.file.Path targetPath = Paths.get(filePath, newFileName);
        File dest = targetPath.toFile();

        // 检查并创建目录
        if (!dest.getParentFile().exists()) {
            if (!dest.getParentFile().mkdirs()) {
                log.error("无法创建目录: {}", dest.getParentFile().getAbsolutePath());
                return ApiResponse.error(500, "目录创建失败");
            }
        }

        try {
            file.transferTo(dest);
            log.info("上传成功，文件路径: {}", dest.getAbsolutePath());
            return ApiResponse.success(dest.getAbsolutePath());
        } catch (IOException e) {
            log.error("文件上传失败", e);
            return ApiResponse.error(500, "文件上传失败：" + e.getMessage());
        }
    }
}